/*************************************************************************
	> File Name: oj-541.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年12月13日 星期日 01时31分10秒
 ************************************************************************/
#include <iostream>
using namespace std;

//arr 邻接矩阵
//ans 保存答案
int n, m, arr[2][20][20], ans[2][100000], cnt[2];

//pnum 人的编号
//now 现在是哪个点
//cost 到此消耗是时间
void func(int pnum, int now, int cost) {
    //递归边界
    if (now == n) {
        ans[pnum][cnt[pnum]++] = cost;
        return ;
    }
    //从现在的点+1开始走
    for (int i = now + 1; i <= n; ++i) {
        //两点间存在边
        if (arr[pnum][now][i] != 0) {
            //消耗为当前消耗+当前点到下一点的消耗
            func(pnum, i , cost + arr[pnum][now][i]);
        }
    }
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        arr[0][a][b] = arr[0][b][a] = c;
        arr[1][a][b] = arr[1][b][a] = d;
    }
    func(0, 1, 0);
    func(1, 1, 0);
    int fin = 2100000000;
    for (int i = 0; i < cnt[0]; ++i) {
        if (fin < ans[0][i]) continue;
        for (int j = 0; j < cnt[1]; ++j) {
            if (ans[0][i] == ans[1][j])
                fin = ans[0][i];
        }
    }
    if (fin == 2100000000) {
        cout << "IMPOSSIBLE" << endl;
    } else {
        cout << fin << endl;
    }
    return 0;
}
